home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / mail / pine3.96.tar.gz / pine3.96.tar / pine3.96 / imap / ANSI / c-client / env_dos.c < prev    next >
C/C++ Source or Header  |  1995-06-27  |  6KB  |  204 lines

  1. /*
  2.  * Program:    DOS environment routines
  3.  *
  4.  * Author:    Mark Crispin
  5.  *        Networks and Distributed Computing
  6.  *        Computing & Communications
  7.  *        University of Washington
  8.  *        Administration Building, AG-44
  9.  *        Seattle, WA  98195
  10.  *        Internet: MRC@CAC.Washington.EDU
  11.  *
  12.  * Date:    1 August 1988
  13.  * Last Edited:    27 June 1995
  14.  *
  15.  * Copyright 1995 by the University of Washington
  16.  *
  17.  *  Permission to use, copy, modify, and distribute this software and its
  18.  * documentation for any purpose and without fee is hereby granted, provided
  19.  * that the above copyright notice appears in all copies and that both the
  20.  * above copyright notice and this permission notice appear in supporting
  21.  * documentation, and that the name of the University of Washington not be
  22.  * used in advertising or publicity pertaining to distribution of the software
  23.  * without specific, written prior permission.  This software is made available
  24.  * "as is", and
  25.  * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
  26.  * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
  27.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
  28.  * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
  29.  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  30.  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
  31.  * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
  32.  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  33.  *
  34.  */
  35.  
  36.  
  37. static char *myLocalHost = NIL;    /* local host name */
  38. static char *myHomeDir = NIL;    /* home directory name */
  39. static char *myNewsrc = NIL;    /* newsrc file name */
  40.  
  41. #include "write.c"        /* include safe writing routines */
  42.  
  43. /* Environment manipulate parameters
  44.  * Accepts: function code
  45.  *        function-dependent value
  46.  * Returns: function-dependent return value
  47.  */
  48.  
  49. void *env_parameters (long function,void *value)
  50. {
  51.   switch ((int) function) {
  52.   case SET_HOMEDIR:
  53.     myHomeDir = cpystr ((char *) value);
  54.     break;
  55.   case GET_HOMEDIR:
  56.     value = (void *) myHomeDir;
  57.     break;
  58.   case SET_LOCALHOST:
  59.     myLocalHost = cpystr ((char *) value);
  60.     break;
  61.   case GET_LOCALHOST:
  62.     value = (void *) myLocalHost;
  63.     break;
  64.   case SET_NEWSRC:
  65.     if (myNewsrc) fs_give ((void **) &myNewsrc);
  66.     myNewsrc = cpystr ((char *) value);
  67.     break;
  68.   case GET_NEWSRC:
  69.     if (!myNewsrc) {        /* set news file name if not defined */
  70.       char tmp[MAILTMPLEN];
  71.       sprintf (tmp,"%s\\NEWSRC",myhomedir ());
  72.       myNewsrc = cpystr (tmp);
  73.     }
  74.     value = (void *) myNewsrc;
  75.     break;
  76.   default:
  77.     value = NIL;        /* error case */
  78.     break;
  79.   }
  80.   return value;
  81. }
  82.  
  83. /* Write current time
  84.  * Accepts: destination string
  85.  *        optional format of day-of-week prefix
  86.  *        format of date and time
  87.  *        flag whether to append symbolic timezone
  88.  */
  89.  
  90. static void do_date (char *date,char *prefix,char *fmt,int suffix)
  91. {
  92.   time_t tn = time (0);
  93.   struct tm *t = gmtime (&tn);
  94.   int zone = t->tm_hour * 60 + t->tm_min;
  95.   int julian = t->tm_yday;
  96.   t = localtime (&tn);        /* get local time now */
  97.                 /* minus UTC minutes since midnight */
  98.   zone = t->tm_hour * 60 + t->tm_min - zone;
  99.   /* julian can be one of:
  100.    *  36x  local time is December 31, UTC is January 1, offset -24 hours
  101.    *    1  local time is 1 day ahead of UTC, offset +24 hours
  102.    *    0  local time is same day as UTC, no offset
  103.    *   -1  local time is 1 day behind UTC, offset -24 hours
  104.    * -36x  local time is January 1, UTC is December 31, offset +24 hours
  105.    */
  106.   if (julian = t->tm_yday -julian)
  107.     zone += ((julian < 0) == (abs (julian) == 1)) ? -24*60 : 24*60;
  108.   if (prefix) {            /* want day of week? */
  109.     sprintf (date,prefix,days[t->tm_wday]);
  110.     date += strlen (date);    /* make next sprintf append */
  111.   }
  112.                 /* output the date */
  113.   sprintf (date,fmt,t->tm_mday,months[t->tm_mon],t->tm_year+1900,
  114.        t->tm_hour,t->tm_min,t->tm_sec,zone/60,abs (zone) % 60);
  115.   if (suffix) {            /* append timezone suffix if desired */
  116.     tzset ();            /* get timezone from TZ environment stuff */
  117.     sprintf (date + strlen (date)," (%s)",
  118.          tzname[daylight ? (((struct tm *) t)->tm_isdst > 0) : 0]);
  119.   }
  120. }
  121.  
  122.  
  123. /* Write current time in RFC 822 format
  124.  * Accepts: destination string
  125.  */
  126.  
  127. void rfc822_date (char *date)
  128. {
  129.   do_date (date,"%s, ","%d %s %d %02d:%02d:%02d %+03d%02d",T);
  130. }
  131.  
  132.  
  133. /* Write current time in internal format
  134.  * Accepts: destination string
  135.  */
  136.  
  137. void internal_date (char *date)
  138. {
  139.   do_date (date,NIL,"%02d-%s-%d %02d:%02d:%02d %+03d%02d",NIL);
  140. }
  141.  
  142. /* Return my home directory name
  143.  * Returns: my home directory name
  144.  */
  145.  
  146. char *myhomedir ()
  147. {
  148.   int i;
  149.   char *s;
  150.   if (!myHomeDir) {        /* get home directory name if not yet known */
  151.     i = strlen (myHomeDir = cpystr ((s = getenv ("HOME")) ? s : ""));
  152.     if (i && ((myHomeDir[i-1] == '\\') || (myHomeDir[i-1]=='/')))
  153.       myHomeDir[i-1] = '\0';    /* tie off trailing directory delimiter */
  154.   }
  155.   return myHomeDir;
  156. }
  157.  
  158.  
  159. /* Return mailbox file name
  160.  * Accepts: destination buffer
  161.  *        mailbox name
  162.  * Returns: file name
  163.  */
  164.  
  165. char *mailboxfile (char *dst,char *name)
  166. {
  167.   char *s;
  168.   char *ext = (char *) mail_parameters (NIL,GET_EXTENSION,NIL);
  169.                 /* forbid extraneous extensions */
  170.   if ((s = strchr ((s = strrchr (name,'\\')) ? s : name,'.')) &&
  171.       ((ext = (char *) mail_parameters (NIL,GET_EXTENSION,NIL)) ||
  172.        strchr (s+1,'.'))) return NIL;
  173.                 /* absolute path name? */
  174.   if ((*name == '\\') || (name[1] == ':')) strcpy (dst,name);
  175.   else sprintf (dst,"%s\\%s",myhomedir (),name);
  176.   if (ext) sprintf (dst + strlen (dst),".%s",ext);
  177.   return ucase (dst);
  178. }
  179.  
  180.  
  181. /* Determine default prototype stream to user
  182.  * Returns: default prototype stream
  183.  */
  184.  
  185. MAILSTREAM *default_proto ()
  186. {
  187.   extern MAILSTREAM DEFAULTPROTO;
  188.   return &DEFAULTPROTO;        /* return default driver's prototype */
  189. }
  190.  
  191. /* Global data */
  192.  
  193. static unsigned rndm = 0;    /* initial `random' number */
  194.  
  195.  
  196. /* Return random number
  197.  */
  198.  
  199. long random ()
  200. {
  201.   if (!rndm) srand (rndm = (unsigned) time (0L));
  202.   return (long) rand ();
  203. }
  204.